import { ElNotification, ElMessageBox, ElMessage } from 'element-plus';
import { getDateTime } from '@/utils/util';
import { ref } from 'vue';
/**
 * @description 接收数据流生成blob，创建链接，下载文件
 * @param {Function} api 导出表格的api方法(必传)
 * @param {String} tempName 导出的文件名(必传)
 * @param {Object} params 导出的参数(默认为空对象)
 * @param {Boolean} isDown 是否是下载模版
 * @param {Boolean} isNotify 是否有导出消息提示(默认为 true)
 * @param {String} fileType 导出的文件格式(默认为.xlsx)
 * @param {Boolean} isDateFileName 导出名是否加时间后缀
 * @return void
 * */
const inExport = ref(true);
export const useDownload = async (
	api: (param: any) => Promise<any>,
	tempName: string,
	params: any = {},
	isDown: boolean = false,
	total: number = 0,
	isNotify: boolean = true,
	fileType: string = '.xlsx',
	isDateFileName: boolean = true
) => {
	if (!inExport.value && !isDown) {
		ElNotification({
			title: '温馨提示',
			message: '正在导出中，请稍等',
			type: 'info',
			duration: 3000
		});
		return;
	}
	if (isNotify && total > 500) {
		ElNotification({
			title: '温馨提示',
			message: '如果数据庞大会导致下载缓慢哦，请您耐心等待！',
			type: 'info',
			duration: 3000
		});
	}

	const downloadFn = async () => {
		const fileName: string = isDateFileName ? `${tempName}_${getDateTime('datetime', new Date(), false, false, true)}` : tempName;
		try {
			inExport.value = false;
			!isDown &&
				ElMessage({
					message: '正在导出中，请稍等',
					duration: 4000,
					type: 'success'
				});
			const res = await api(params);
			// 这个地方的 type，经测试不传也没事，因为会自动识别文件类型
			// const blob = new Blob([res], {
			// 	type: "application/vnd.ms-excel;charset=UTF-8"
			// });
			const blob = new Blob([res]);
			// 兼容edge不支持createObjectURL方法
			if ('msSaveOrOpenBlob' in navigator) return window.navigator.msSaveOrOpenBlob(blob, fileName + fileType);
			const blobUrl = window.URL.createObjectURL(blob);
			const exportFile = document.createElement('a');
			exportFile.style.display = 'none';
			exportFile.download = `${fileName}${fileType}`;
			exportFile.href = blobUrl;
			document.body.appendChild(exportFile);
			exportFile.click();
			// 去除下载对url的影响
			document.body.removeChild(exportFile);
			window.URL.revokeObjectURL(blobUrl);
			inExport.value = true;
		} catch (error) {
			console.log(error);
			inExport.value = true;
		}
	};
	// 当导出数据岛屿10000条时，一次最多导出10000条
	if (total > 10000) {
		ElMessageBox.confirm(
			'您需要导出的数据超过最大允许导出数据（10000条），若选择继续导出则系统自动导出列表前10000条数据!',
			'提示',
			{
				confirmButtonText: '确定',
				cancelButtonText: '取消',
				type: 'warning'
			}
		)
			.then(() => {
				downloadFn();
			})
			.catch(() => {
				ElMessage({
					type: 'info',
					message: '导出异常'
				});
			});
		return;
	}
	downloadFn();
};
